/*!
 * \file ProjectableVertexSet.h
 *
 * \date May 19, 2014
 * \author correa
 */
#ifndef PROJECTABLEVERTEXSET_H_
#define PROJECTABLEVERTEXSET_H_

#include <VertexSet.h>

using namespace std;

class WeightedVertexSet : public VertexSet {
	int			_size;			//!< El número de elementos. No es calculado por este objeto.
	double		_weight;
	Lista&		_enumerables;	//!< usado para enumerar los elementos de conjunto tipo VertexSet

public:
	WeightedVertexSet(int s) : VertexSet(s), _size(0), _weight(0.0), _enumerables(*(new Lista(s))) {};
	WeightedVertexSet(const VertexSet &c, int s, double w) : VertexSet(c), _size(s), _weight(w), _enumerables(c.lista()) {};
	WeightedVertexSet(WeightedVertexSet &c) : VertexSet(c), _size(c._size), _weight(c._weight), _enumerables(*(new Lista(c._enumerables))) {};
	~WeightedVertexSet() { delete &_enumerables; };
	void add(int e, double w) { VertexSet::add(e); _size++; _weight += w; _enumerables += e; };
	void add(int e) { add(e, 1); };
	void removeAll() { VertexSet::removeAll(); _size = 0; _weight = 0.0; _enumerables.clear(); };
	void addAll() { cout << "addAll" << endl; throw(-1); };
	void addAll(const BitMapSet &otro) { cout << "addAll1" << endl; throw(-1); };
	void addAll(const VertexSet &otro, int s, double w) { VertexSet::addAll(otro); _size=s; _weight=w; };
	void addAll(const int from, const int to) { cout << "addAll2" << endl; throw(-1); };
	void copyAll(const BitMapSet& otro) { cout << "copyAll" << endl; throw(-1); };
	void copyAll(const VertexSet& otro, int s, double w) { VertexSet::copyAll(otro); _size=s; _weight=w; _enumerables.clear(); otro.lista(_enumerables); };
	void retainAll(const BitMapSet &otro) { throw(-1); };
	void remove(int e) { cout << "remove" << endl; throw(-1); };
	void removeAll(const BitMapSet &otro) { throw(-1); };
	void symmetDiff(const BitMapSet &otro) { throw(-1); };
	void turnToCompl() { throw(-1); };
	int size() const { return _size; };
	double weight() const { return _weight; };
	Lista &lista() const { return _enumerables; };
};

class ProjectableCliqueSet : public WeightedVertexSet {

public:
	ProjectableCliqueSet(int s) : WeightedVertexSet(s) {};
	ProjectableCliqueSet(const VertexSet &c, int s, double w) : WeightedVertexSet(c, s, w) {};
	ProjectableCliqueSet(ProjectableCliqueSet &c) : WeightedVertexSet(c) {};
	~ProjectableCliqueSet() {};
	void addVecindadComun(const VertexSet &otro) { VertexSet::addAll(otro); };
};

#endif /* PROJECTABLEVERTEXSET_H_ */
